// 通用：在手机系统返回（popstate）时清理页面数据并清除 KeepAlive 缓存
// 使用方式：在各页面 setup 中调用 useHardwareBackCleanup('PageName', resetFn)
// 说明：
// - 仅在页面激活/挂载时绑定 popstate 监听，页面失活/卸载时解绑，避免重复
// - 触发时调用传入的 resetFn，并派发 clear-keepalive-cache 事件

import { onMounted, onUnmounted, onActivated, onDeactivated } from 'vue';
// 供动态导入使用，避免 Vite 在构建阶段解析缺失模块
const CAP_APP_MODULE_ID = '@capacitor/app';

type ResetFn = () => void;

interface Options {
  debugAlert?: boolean;
}

export function useHardwareBackCleanup(pageName: string, resetFn: ResetFn, options?: Options) {
  let attached = false;
  let capListener: { remove?: () => Promise<void> | void } | null = null;
  // 记录最近一次导航的 history.position，用于判断前进/后退方向
  let lastPos: number | null = null;
  // 保存全局 router:navigation 监听器，便于解绑
  let navHandler: ((ev: Event) => void) | null = null;

  const getHistoryPosition = (): number | null => {
    try {
      const s = window.history.state as any;
      return s && typeof s.position === 'number' ? s.position : null;
    } catch (_) {
      return null;
    }
  };

  const handler = (evt: Event) => {
    try {
      const curPos = getHistoryPosition();
      const isBackByPos = (typeof lastPos === 'number' && typeof curPos === 'number')
        ? (curPos < lastPos)
        : false;

      if (options?.debugAlert) {
        // 显示调试弹窗，确认是否捕获到系统返回
        alert(`[${pageName}] 捕获到返回事件：${evt.type}\nlastPos=${lastPos ?? 'null'} -> curPos=${curPos ?? 'null'}\n判定isBack=${isBackByPos}`);
      }
      // 控制台日志辅助调试
      if (options?.debugAlert) {
        console.log(`[useHardwareBackCleanup] ${pageName} 捕获到返回事件:`, evt, { lastPos, curPos, isBackByPos });
      }
      const t = evt.type;
      // 仅在明确的“后退”来源时执行重置与清缓存
      // popstate/hashchange: 浏览器历史变更（结合 position 判断后退）
      // backbutton: Cordova/安卓实体返回
      // capacitor:backButton: Capacitor 原生返回
      const isNativeBack = (t === 'backbutton' || t === 'capacitor:backButton');
      const isBrowserHistoryEvent = (t === 'popstate' || t === 'hashchange');
      const shouldReset = isNativeBack || (isBrowserHistoryEvent && isBackByPos);
      if (shouldReset) {
        // 执行页面自定义重置逻辑
        resetFn?.();
        // 清理当前页的 KeepAlive 缓存
        if (pageName) {
          window.dispatchEvent(
            new CustomEvent('clear-keepalive-cache', { detail: { name: pageName } })
          );
        }
      }
      // 更新最近一次 position
      if (typeof curPos === 'number') {
        lastPos = curPos;
      }
    } catch (err) {
      console.warn('[useHardwareBackCleanup] 处理系统返回失败:', err);
    }
  };

  const add = () => {
    if (!attached) {
      // 初始化最近一次历史位置
      lastPos = getHistoryPosition();
      window.addEventListener('popstate', handler);
      // 兼容 hash 路由：结合 position 判断方向，避免前进导航被误清理
      window.addEventListener('hashchange', handler);
      // 兼容 Cordova：安卓实体返回键
      document.addEventListener('backbutton', handler);
      // 兼容 Capacitor：原生返回键（动态加载以避免构建依赖问题）
      try {
        // 动态导入，若项目未集成 Capacitor 则忽略错误
        // 使用 @vite-ignore 避免 Vite 构建阶段解析缺失模块
        // @ts-ignore
        import(/* @vite-ignore */ CAP_APP_MODULE_ID).then((mod: any) => {
          const App = mod?.App;
          if (App && typeof App.addListener === 'function') {
            capListener = App.addListener('backButton', () => {
              handler(new Event('capacitor:backButton'));
            });
          }
        }).catch(() => {});
      } catch (_) {
        // ignore
      }
      // 统一接收来自全局路由守卫的导航事件（无需依赖浏览器事件）
      navHandler = (ev: Event) => {
        try {
          const custom = ev as CustomEvent;
          const detail = (custom && custom.detail) || {};
          const isBack = !!detail.isBack;
          const pos = detail?.position?.curPos;
          const toName = (detail?.to?.name as string) || '';
          const fromName = (detail?.from?.name as string) || '';
          if (options?.debugAlert) {
            alert(`[${pageName}] router:navigation isBack=${isBack} curPos=${pos ?? 'unknown'}\nfrom=${fromName} -> to=${toName}`);
          }
          // 若是“后退进入一个 KeepAlive 页面”（如新增页），则不清理，避免丢失填写数据
          const toIsKeepAlive = !!(detail?.to?.meta && (detail.to.meta as any).keepAlive);
          if (isBack && toIsKeepAlive) {
            return;
          }
          // 仅在“从当前页面后退离开”时执行重置：from === 当前页面
          // 返回到当前页面（to === 当前页面 / 或任意目标为 KeepAlive 页面）不应清理，以保留填写中的数据
          if (isBack && fromName === pageName) {
            resetFn?.();
            if (pageName) {
              window.dispatchEvent(new CustomEvent('clear-keepalive-cache', { detail: { name: pageName } }));
            }
          }
          if (typeof pos === 'number') {
            lastPos = pos;
          }
        } catch (e) {
          console.warn('[useHardwareBackCleanup] 处理router:navigation事件失败:', e);
        }
      };
      window.addEventListener('router:navigation', navHandler);
      attached = true;
    }
  };

  const remove = () => {
    if (attached) {
      window.removeEventListener('popstate', handler);
      window.removeEventListener('hashchange', handler);
      document.removeEventListener('backbutton', handler);
      if (navHandler) {
        window.removeEventListener('router:navigation', navHandler);
        navHandler = null;
      }
      try {
        capListener?.remove?.();
      } catch (_) {
        // ignore
      }
      attached = false;
    }
  };

  onMounted(add);
  onActivated(add);
  onUnmounted(remove);
  onDeactivated(remove);
}